package com.cskaoyan.javase.network._2tcp._v5;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;

/**
 * 客户端
 * 客户端上传文件到服务端
 *
 * 在客户端中,数据是如何流动的?
 * 外存中的文件数据 --> 读到内存中(服务端进程),这个过程依赖于自己创建一个字节输入流
 * --> 把数据发送给服务端,这个过程依赖于Socket对象的输出流
 *
 * @since 16:31
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Client {
    public static void main(String[] args) throws IOException {
        // 1.创建一个字节输入流,将上传的文件读取到该进程中
        FileInputStream in = new FileInputStream("E:\\1\\客户端文件夹\\学习资料.mp4");
        // 2.创建客户端套接字,然后获取输出流,写数据
        Socket socket = new Socket("127.0.0.1", 9999);
        OutputStream out = socket.getOutputStream();
        byte[] buf = new byte[1024];
        int readCount;
        while ((readCount = in.read(buf)) != -1) {
            // 写
            out.write(buf, 0, readCount);
        }
        System.out.println("循环已完成,文件已经上传到服务器!");
        // socket.close();
        // 这里应该关闭Socket对象的输出流,仅关闭输出流,输入流下面还要用
        socket.shutdownOutput();

        // 循环结束后,文件数据已经传输完毕
        // 这时开始接收服务端的反馈,也就是读服务端传输的数据,用Socket对象的输入流
        InputStream in2 = socket.getInputStream();
        System.out.println("read before");
        int readCount2 = in2.read(buf);
        System.out.println("read after");
        System.out.println(new String(buf, 0, readCount2));

        in2.close();
        in.close();
        socket.close();
    }
}
